package cn.bonoon.entities;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Inheritance;
import javax.persistence.InheritanceType;
import javax.persistence.Table;

import cn.bonoon.kernel.support.entities.BaseEntity;
import cn.bonoon.kernel.support.entities.EntityStatus;

/**
 * 去掉角色与其它实体的关联，只能从其它实体对角色进行关联
 * 
 * 这个是基本角色，是全局的，但子类可以是某个具体域范围的
 * @author jackson
 *
 */
@Entity
@Table(name = "t_role")
@Inheritance(strategy = InheritanceType.JOINED)
public class RoleEntity extends BaseEntity implements EntityStatus {
	
	/**
	 * 
	 */
	private static final long serialVersionUID = 278857711439158467L;

	/**
	 * 如子类可以是职位、职务等，因为相应的职位或职务对应系统不同的功能。如：业务员、仓库管理人员等职位
	 */
	@Column(name = "C_TYPENAME", length = 10)
	protected String typeName = "角色";
	
	/**
	 * <pre>
	 * 在分配用户角色的时候能否直接分配，如果true则表示可以直接分配，否则不允许；
	 * 应用的场景：职位，某个职位应该指定某些操作的功能，在职位变动的时候该用户的操作
	 * 功能应该跟着相应的改变，但职位却不应该出现在用户的角色管理里
	 * </pre>
	 */
	@Column(name = "C_SELECTROLE")
	private boolean selectRole;
	
	@Column(name = "C_ROLEKEY", length = 20)
	private String roleKey;

	/**
	 * <pre>
	 * 子系统
	 * 该权限所支持的子系统.在对用户权限进行判断时,首先应该判断是否能访问该子系统.
	 * 如果不能访问子系统,那么即使定义了该子系统下面的某些功能可访问,也不能访问这些功能.
	 * 一个角色的定义只能访问一个子系统,如果需要一个角色需要访问多个子系统,则应该为该用户
	 * 分配多个角色.
	 * </pre>
	 */
	@Column(name = "C_MODULEKEY", length = 64)
	private String moduleKey;
	
	@Column(name = "C_MODULENAME", length = 100)
	private String moduleName;
	
	/**
	 * <pre>
	 * 表明该角色是否是默认的角色.
	 * 如果是默认的角色,并且已经为一个用户分配了多个角色,用户在登录系统的时候会先找出被
	 * 定义为默认的角色,登录成功后就进入该角色所指定的子系统.
	 * 如果为一个用户分配了超过一个的默认角色,则只返回第一个被定义为默认的角色.
	 * 如果为一个用户被分配的角色里没有默认角色,则返回角色列表中的第一个(即随机的不可控制的).
	 * </pre>
	 */
	@Column(name = "C_DEFROLE")
	private boolean defaultRole;
	
	/**
	 * -1:禁止，0:未启用，1:正常，2:其它   
	 */
	@Column(name = "C_STATUS")
	private int status;

	public void setTypeName(String typeName) {
		this.typeName = typeName;
	}
	
	public String getTypeName() {
		return typeName;
	}
	
	public void setDefaultRole(boolean defaultRole) {
		this.defaultRole = defaultRole;
	}

	public boolean isDefaultRole() {
		return defaultRole;
	}

	public String getRoleKey() {
		return roleKey;
	}

	public void setRoleKey(String roleKey) {
		this.roleKey = roleKey;
	}

	public String getModuleKey() {
		return moduleKey;
	}

	public void setModuleKey(String moduleKey) {
		this.moduleKey = moduleKey;
	}

	public boolean isSelectRole() {
		return selectRole;
	}

	public void setSelectRole(boolean selectRole) {
		this.selectRole = selectRole;
	}

	public String getModuleName() {
		return moduleName;
	}

	public void setModuleName(String moduleName) {
		this.moduleName = moduleName;
	}

	public int getStatus() {
		return status;
	}

	public void setStatus(int status) {
		this.status = status;
	}
}
